﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using System.Collections;

namespace LCWMS
{
    public partial class  w_so070 : DockContent
    {
        DataSet dscustomer;
        DataSet ds_tran;
        Cursor currentCursor = Cursor.Current;

        public w_so070()
        {
            InitializeComponent();
            dgv_tran.AutoGenerateColumns = false;
        }



        //添加采购定单的合计行
        private void f_add_order()
        {
            decimal d_1, d_2, d_3, d_4, d_5, d_6, d_7;
            DataTable dt_put;
            //增加一个合计行 
            dt_put = (DataTable)dgv_tran.DataSource;
            d_1 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["planqty"].ColumnName + ")", "true");
            d_2 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["planamount"].ColumnName + ")", "true");
            //d_3 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["skuamount"].ColumnName + ")", "true");
            //d_4 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["shouldqty"].ColumnName + ")", "true");
            d_5 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["allocateqty"].ColumnName + ")", "true");
            d_6 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["allocateamount"].ColumnName + ")", "true");
            //d_7 = (decimal)dt_put.Compute("Sum(" + dt_put.Columns["shotqty"].ColumnName + ")", "true");
            DataRow dr = dt_put.NewRow();
            dr["barcode"] = "合计";
            dr["planqty"] = d_1;
            dr["planamount"] = d_2;
            //dr["skuamount"] = d_3;
            //dr["shouldqty"] = d_4;
            dr["allocateqty"] = d_5;
            dr["allocateamount"] = d_6;
            //dr["shotqty"] = d_7;
            ((DataTable)dgv_tran.DataSource).Rows.InsertAt(dr, ((DataTable)dgv_tran.DataSource).Rows.Count);
        }


        private void btn_Query_Click(object sender, EventArgs e)
        {


            lb_rows.Text = "总行数：0";

            // 设置为忙碌状态
            Cursor.Current = Cursors.WaitCursor;
 
            string str_sql = 
                        
                " SELECT " +
                "   RTRIM(a.so_day) so_day, " +
                "   RTRIM(b.sku) sku, " + // -- 商品编码
                "   RTRIM(d.sku_name) sku_name, " + // -- 商品名称
                "   RTRIM(d.barcode) barcode, " + // -- 主条码
                "   RTRIM(msbg.barcode_group) barcode_group, " + //  -- 多条码
                "   RTRIM(d.class_code3) class_code3, " + // -- 商品类别
                "   RTRIM(sc3.class_name) AS class_name3, " + // --类别名称
                "   CAST (SUM(b.plan_so_qty_m) AS DECIMAL (13, 0)) AS planqty, " + // -- 申请数量
                "   CAST (SUM(b.allocate_qty_m) AS DECIMAL (13, 0)) AS allocateqty, " + // -- 备货数量
                "   CAST (SUM(b.plan_so_qty_m  * b.order_price) AS DECIMAL (13, 3)) AS planamount, " + // -- 申请金额
                "   CAST (SUM(b.allocate_qty_m * b.order_price) AS DECIMAL (13, 3)) AS allocateamount, " + // -- 备货金额
                "   ( " + // 
                "       CASE " + // 
                "         WHEN isnull(CAST (SUM(b.plan_so_qty_m) AS DECIMAL (13, 3)), 0) > 0  " + // 
                "         THEN CONVERT ( VARCHAR, CAST ( isnull(CAST (SUM(b.allocate_qty_m) AS DECIMAL (13, 3)), 0) * 100.0 / CAST (SUM(b.plan_so_qty_m) AS DECIMAL (13, 3)) AS DECIMAL (13, 2))) + '%' ELSE '0.00%'  " + // 
                "      END " + // 
                "   ) AS qtyper, " + // 
                "  " + // 
                "   ( " + // 
                "       CASE " + // 
                "         WHEN isnull(CAST (SUM(b.plan_so_qty_m  * b.order_price) AS DECIMAL (13, 3)), 0) > 0  " + // 
                "         THEN CONVERT ( VARCHAR, CAST ( isnull(CAST (SUM(b.allocate_qty_m * b.order_price) AS DECIMAL (13, 3)), 0) * 100.0 / CAST (SUM(b.plan_so_qty_m  * b.order_price) AS DECIMAL (13, 3)) AS DECIMAL (13, 2))) + '%' ELSE '0.00%'  " + // 
                "      END " + // 
                "   ) AS amountper " + // 
                "  " + // 
                "  " + // 
                " FROM " + // 
                "   WMS.so_ship_header a " + // 
                "   JOIN WMS.so_ship_detail b ON a.so_no = b.so_no  " + // 
                "   AND a.inv_org = b.inv_org  " + // 
                "   AND a.consignor = b.consignor " + // 
                "   JOIN WMS.mst_customer c ON a.customer_code = c.consignor " + // 
                "   JOIN WMS.mst_sku d ON b.sku = d.sku  " + // 
                "   AND b.inv_org = d.inv_org  " + // 
                "   AND b.consignor = d.consignor " + // 
                "   LEFT JOIN WMS.mst_stat_class sc3 ON d.class_code3 = sc3.class_code  " + // 
                "   AND sc3.class_flag = 'C3' " + // 
                "   LEFT JOIN WMS.mst_location e ON d.inv_org = e.inv_org  " + // 
                "   AND d.fix_location = e.location_code " + // 
                "   LEFT JOIN WMS.mst_area f ON e.inv_org = f.inv_org  " + // 
                "   AND e.area_code = f.area_code  " + // 
                "   left join ( " + // 
                "     SELECT  sku , " + // 
                "           barcode_group = ( STUFF(( SELECT    ',' + barcode " + // 
                "                             FROM      wms.mst_sku_barcode " + // 
                "                             WHERE     sku = Test.sku " + // 
                "                           FOR " + // 
                "                             XML PATH('') " + // 
                "                           ), 1, 1, '') ) " + // 
                "     FROM    wms.mst_sku_barcode AS Test " + // 
                "     GROUP BY sku " + // 
                "    ) as msbg on b.sku = msbg.sku " + // 
                "  " + // 
                " WHERE  1 = 1 AND  a.inv_org ='" + main.g_org + "' and (a.so_type='0' or a.so_type='3') AND convert(varchar(10),a.prepare_time,102)  = '" + dtp_h_endtime.Text.ToString().Trim() + "' ";


            string str_sql_where = "";
            if (cb_consignor.Text.Trim() != "")
            {
                str_sql_where = " and a.consignor = '" + cb_consignor.Text.Trim() + "'";
            }





            
            //判断商品码
            if (tb_sku.Text.Trim() != "")
            {
                string[] skuList = tb_sku.Text.Trim().Split(',');
                string skuWhere = "";
                if (skuList.Length > 0)
                {
                    foreach (string item in skuList)
                    {
                        if (skuWhere == "")
                        {
                            skuWhere = "'" + item + "'";
                        }
                        else
                        {
                            skuWhere += ",'" + item + "'";
                        }
                    }
                    str_sql = str_sql + " and b.sku in (" + skuWhere + ")";
                }

                //str_sql = str_sql + " and b.sku = '" + tb_sku.Text.Trim() + "'";
            }
            
            str_sql += " GROUP BY a.so_day, b.sku, d.sku_name, d.barcode, msbg.barcode_group, d.class_code3, sc3.class_name  ";
            str_sql += " ORDER BY b.sku ";
            try
            {
                if (main.dbtype == "SQL")
                {
                    ds_tran = main.dbservice.Sql_exec_selectsql(str_sql);
                }
                else
                {
                    ds_tran = main.dbservice.oracle_exec_selectsql(str_sql);
                }
                if (ds_tran.Tables[0].Rows.Count > 0)
                {
                    lb_rows.Text = "总行数：" + ds_tran.Tables[0].Rows.Count.ToString();
                    dgv_tran.DataSource = ds_tran.Tables[0];
                    f_add_order();
                }
                else
                    dgv_tran.DataSource = null;
            }
            catch (System.Exception ee)
            {
                dgv_tran.DataSource = null;
                MessageBox.Show(main.g_class.comm_getchangestring("Fail to Query", main.g_info_dataset) + "!" + ee.ToString());
            }
            Cursor.Current = currentCursor;
        }

        private void w_so063_Load(object sender, EventArgs e)
        {
            
            dscustomer = new DataSet();
            
          
            try
            {
                dscustomer = new DataSet();
                dscustomer = main.g_class.comm_get_consignor();
                cb_consignor.DataSource = dscustomer.Tables[0];
                cb_consignor.ValueMember = "consignor";
                cb_consignor.DisplayMember = "consignor";

                //语言转换
                main.g_class.comm_changeControl(this, main.g_win_dataset);
            }
            catch (System.Exception ee)
            {
                MessageBox.Show(main.g_class.comm_getchangestring("Fail to initialize Information of transaction type", main.g_info_dataset) + "!" + ee.ToString());
                return;
            }
            
            dtp_h_endtime.CustomFormat = "yyyy.MM.dd";
            dtp_h_endtime.Format = DateTimePickerFormat.Custom;
            dtp_h_endtime.Value = System.Convert.ToDateTime(DateTime.Now.ToString("yyyy.MM.dd").Trim());

            //按钮权限控制
            string str_right;
            str_right = main.g_class.comm_getright("w_so070", main.g_right_dataset);


            //查询
            if (str_right.Substring(4, 1) == "0")
            {
                this.btn_Query.Visible = false;
            }

            else
            {
                this.btn_Query.Visible = true;
            }

            //导出ＥＸＣＥＬ
            if (str_right.Substring(5, 1) == "0")
            {
                this.btn_excel.Visible = false;
            }
            else
            {
                this.btn_excel.Visible = true;
            }

        }

        private void dgv_tran_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void lb_batchno_Click(object sender, EventArgs e)
        {

        }

        private void dgv_tran_CellClick(object sender, DataGridViewCellEventArgs e)
        {
           // i_trans_header = e.ColumnIndex;

        }

        private void dgv_tran_Sorted(object sender, EventArgs e)
        {
            //string str_headertext;
            ////先删除合计行
            //((DataTable)dgv_tran.DataSource).Rows.Remove(((DataTable)dgv_tran.DataSource).Select("pack_code = '合计'")[0]);
            ////然后对Tables[0]重新排序
            //DataTable dt;
            //DataView dv = ((DataTable)dgv_tran.DataSource).DefaultView;
            ////得到点击的列
            //str_headertext = dgv_tran.Columns[i_trans_header].DataPropertyName.ToString().Trim();
            //if (b_trans_sort) //升序
            //{
            //    dv.Sort = str_headertext + " DESC";
            //    b_trans_sort = false;
            //}
            //else
            //{
            //    dv.Sort = str_headertext;
            //    b_trans_sort = true;
            //}
            //dt = dv.ToTable();
            //dgv_tran.DataSource = null;
            //dgv_tran.DataSource = dt;
            ////增加合计行
            //f_add_transf();
        }

        private void cb_consignor_TextChanged(object sender, EventArgs e)
        {
            string str_cust;
            str_cust = cb_consignor.Text.Trim();
            tb_cusname.Text = main.g_class.comm_findname(str_cust, dscustomer);
        }

        private void dgv_tran_DoubleClick(object sender, EventArgs e)
        {
             
        }
        private void btn_excel_Click(object sender, EventArgs e)
        {
            if (dgv_tran.Rows.Count > 0)
            {
                main.g_class.DataGridViewToExcel(dgv_tran);
            }
        }


        //复制某一列值到剪贴板
        private void CopyColumnValueToClipboard(DataGridView dgv, int rowIndex, int columnIndex)
        {
            if (dgv.Rows.Count <= rowIndex || columnIndex < 0)
            {
                // 检查索引是否超出范围
                return;
            }

            string value = dgv.Rows[rowIndex].Cells[columnIndex].Value.ToString();
            if (value != null)
            {
                Clipboard.SetText(value);


                MessageBox.Show("已复制到剪贴板");
            }
        }

        private void dgv_tran_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int i_temp = dgv_tran.CurrentRow.Index;
            string str_name = dgv_tran.Columns[dgv_tran.CurrentCell.ColumnIndex].Name.ToString().Trim();
            //if (str_name == "so_no")
            //{

                //如果你想复制第二行第三列的值：
            CopyColumnValueToClipboard(dgv_tran, i_temp, dgv_tran.CurrentCell.ColumnIndex);
            //}
        }

        private void dgv_tran_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            //自动编号，与数据无关
            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
               e.RowBounds.Location.Y,
               dgv_tran.RowHeadersWidth - 4,
               e.RowBounds.Height);
            TextRenderer.DrawText(e.Graphics,
                  (e.RowIndex + 1).ToString(),
                   dgv_tran.RowHeadersDefaultCellStyle.Font,
                   rectangle,
                   dgv_tran.RowHeadersDefaultCellStyle.ForeColor,
                   TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
        }

        // 删除行
        private void dgv_tran_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                ContextMenu m = new ContextMenu(); // 创建一个 ContextMenu
                MenuItem deleteRowItem = new MenuItem("删除行"); // 创建一个 MenuItem
                deleteRowItem.Click += dgv_tran_DeleteRowItem_Click; // 添加点击事件
                m.MenuItems.Add(deleteRowItem);

                int currentMouseOverRow = dgv_tran.HitTest(e.X, e.Y).RowIndex;   // 将 MenuItem 添加到 ContextMenu
                m.Show(dgv_tran, new Point(e.X, e.Y));                           // 显示 ContextMenu
            }
        }

        private void dgv_tran_DeleteRowItem_Click(object sender, EventArgs e)
        {

            w_dgv_deleterow wsingle = new w_dgv_deleterow();
            wsingle.ShowDialog();
            int i_row_start = w_dgv_deleterow.i_row_start - 1;
            int i_row_end = w_dgv_deleterow.i_row_end - 1;

            // 确保起始行和结束行在有效范围内
            if (i_row_start < 0) return;
            if (i_row_end >= dgv_tran.Rows.Count || i_row_start > i_row_end)
            {
                MessageBox.Show("超出有效范围！");
                return;
            }

            // 从 DataGridView 中删除指定范围的行 (从后向前删除行，避免索引变化问题)
            for (int i = i_row_end; i >= i_row_start; i--)
            {
                dgv_tran.Rows.RemoveAt(i);
            }

        }
    }
}